from pyx_package.script import BaseBehavior
from pyx_package.ps_paramete import PsParameter

PYX_MODULE_NAME = "type convert"

class ScriptBehavior(BaseBehavior):

    class Type(str):
        Str = "str"
        Int = "int"
        Float = "float"
        Bool = "bool"

    def __init__(self) -> None:
        super().__init__()
        
        self.SetExeMode("function")

        #输入数据
        self.p_input_data = self.CreateParam(
            "input_data", "输入数据", PsParameter.Input, any)

        #输入数据的类型
        self.p_output_data_type = self.CreateParam(
            "output_data_type", "输出数据类型", PsParameter.Input, str)

        #输出数据
        self.p_output_data = self.CreateParam(
            "output_data", "输出数据", PsParameter.Output, any)
        
        #设置回调函数
        self.p_output_data_type.SetValueChangedFunc("call_type_changed_func")

        #设置类型为combox类型
        self.p_output_data_type.value_input_mode = PsParameter.ComboBoxMode

        #combobox选项数据
        self.p_output_data_type.SetOptionitems([
            self.Type.Str,
            self.Type.Int,
            self.Type.Float,
            self.Type.Bool
        ])
        
    def call_type_changed_func(self):
        '''
            当输出数据类型改变时触发
        '''

        #判断当前修改之后是什么类型
        type_str = self.p_output_data_type.value

        if type_str == self.Type.Str:
            self.p_output_data.type = str
        elif type_str == self.Type.Int:
            self.p_output_data.type = int
        elif type_str == self.Type.Float:
            self.p_output_data.type = float
        elif type_str == self.Type.Bool:
            self.p_output_data.type = bool

    def DoStep(self):
    
        #尝试转换
        try:
            value = self.p_output_data.type(self.p_input_data.value)

            self.p_output_data.value = value
            
        except:

            err_msg = "from " + str(type(self.p_input_data.value).__name__) + " to " + str(self.p_output_data_type.value)
            self.Debug("convert failed: " + err_msg, "error")
        